嗨各位,不知道各位有沒有維運服務備份說過 XXX 壞了,幫我看一下
的經驗呢?
在不用網管系統 (NMS,好比 LibreNMS
) 的情況下,我們通常最直覺的方式就是去 ping
特定的主機或是直接看特定連接埠(Port)的服務吧?
而今天要講的是我用來初步排查網路問題的腳本 network.sh
首先前情提要,在幾個月前,我們實驗室機房的網路大致分為 8樓機房
和 7樓庫房
(7樓也是有放主機,不過大部分放在8樓)
而某天,神奇(弔詭)的事情發生了
我的 做AI大師 夥伴和我反應說
誒 Vincent , 我的某臺機器連 VPN 可以連到,可是直接從七樓連不到誒
而想必此時螢幕前聰明的你,從我前幾句的前情提要就能推導出
(我當時在處理這件事情時沒有想到這裡)
8樓機房
和 7樓庫房
之間有拉網路線7樓實驗室的AP
直連到 7樓庫房
後再上去 8樓機房
說老實我一開始也覺得很納悶,干嘛餒?
但後來測試後發現確實如此就開始納悶
為了不讓人有覺得我在水字數的嫌疑
我就直接講結論了,是我們在 7樓庫房
的其中一台Switch
往生了
而這也是我產生了想要做快速排查腳本的原因
一來是我一次要檢查的主機數量不少
(NAS*2 VPN*1 PVE_Host*12 ...)
再來是,想要快速檢查主機是否可被存取通常是使用 Ping(ICMP)
來檢查目標主機是否有回覆
但這忽略掉了一件事情,也就是網路拓墣圖
於是乎,我寫了一個用來快速排查實驗室服務狀態的腳本
(下面全部服務不可用是因為我現在不在實驗室沒連 VPN,不是實驗室被隕石砸了)
圖: 腳本執行結果
這個腳本對於我(維運人員)的好處在於
而在寫這份腳本時,我也挖到了一些有趣的東西
我相信應該身邊大部分會說 shell script
很簡單的人都沒想過能這樣用
圖: 變數
圖: 迴圈
對了,如果你覺得這份 shell script 可能會幫到你,我之後會把它開源在 HBFS 這份專案下
這份腳本大部分的人應該大部分都看得懂
少部分看不懂的地方大概就是
${!host}
在大部分的程式語言的變數都是一對一的鍵(key)值(value)的關係
而 shell script
在做變數解析時,可以做的事情是用 key 解析出的 value 再做一次 key-value 轉換取值
(簡單來說就是俄羅斯套娃的概念)
而這也是 bash
中的 Indirect References
參考資料: Advanced Bash-Scripting Guide: Chapter 28. Indirect References
回到腳本
當最外圈的 for迴圈
在每次的 loop 時,每次 loop 中都會有 host 變數
而 host 的值依序為: gw、cs、NAS173...
而這時,我們再用 host 變數解析出來的 value (gw、cs、NAS173)
當作 key 再進行解析,也就達到了可以同時儲存主機名稱和IP的目的
以上就是我在機房維運的過程中發現 shell script
的奇淫怪招分享給各位
好了,我們明天見